/*
 * VisualComponentVia.h
 *
 *  Created on: Aug 22, 2013
 *      Author: root
 */

#ifndef VISUALCOMPONENTVIA_H_
#define VISUALCOMPONENTVIA_H_

#include "gui/VisualComponents/VisualDiagramComponent.h"
#include "gui/Dibujar/AuxiliarDibujar.h"
#include "gui/SubWindow/Workspace.h"
#include "utils/Point.h"
#include "model/Via.h"

class VisualComponentConector;
class VisualComponentSegment;

/**
 * @brief Representa a una via compuesta por diferentes segmentos.
 * La misma cumple los siguientes invariantes:
 * - Esta compuesta de segmentos alternados entre (- | - | -, etc) o ( | - | - |, etc).
 * - Cada segmento esta parametrizado por : Un punto inicial, una longitud y un sentido ( | o -).
 * - Los segmentos estan encadenados de forma que cada uno tiene referencia al anterior y al siguiente, (pueden ser null en caso de ser un extremo).
 * - El punto inicial de cada segmento corresponde al punto final del segmento anterior (dado por punto inicial + longitud en direccion de sentido).
 */
class VisualComponentVia : public virtual VisualDiagramComponent {

protected:
    VisualComponentConector *m_startConector;
    VisualComponentConector *m_endConector;

	void initializeSegments();

public:
	VisualComponentVia(VisualComponentConector* start, Diagram* diagram, VisualComponentConector* end = NULL);
	VisualComponentVia(const VisualComponentVia& other);
	VisualComponentVia(Diagram* diagram);
	virtual ~VisualComponentVia();

	virtual void on_move(int x, int y);
	void createSegments();
	virtual InfluenceArea getInfluenceArea();

//	virtual void load(XmlReader& reader, Diagram* diagram) = 0;

	void extend();

	void setStartConector( VisualComponentConector* connector);
	void setEndConector( VisualComponentConector* connector);
    VisualComponentConector *getStartConector() const { return m_startConector;}
    VisualComponentConector *getEndConector() const { return m_endConector;}

    void alignSegment(VisualComponentSegment *editedSegment);

    virtual void invertConnections();
//    virtual VisualDERComponent *getCopy(Diagram* diagram);

	virtual void setSelected(bool sel);

//	virtual void draw(Cairo::RefPtr<Cairo::Context> ptrContext) = 0;
//	virtual void showProperties() = 0;
protected:
	virtual void alignPoints(Point *newPoint, Point *alignPoint, int x, int y, bool allignY);
};

#endif /* VISUALCOMPONENTVIA_H_ */
